package com.woniuxy.topicRouting;

import com.rabbitmq.client.*;
import com.woniuxy.utils.RabbitConnection;
import lombok.extern.log4j.Log4j2;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Author: linKe
 * @Date: 2022/1/10 16:37
 * @FileName: Consumer
 * @version: 1.0
 * @Description: Topic模式 消费者
 */
@Log4j2
public class ConsumerTopicSms {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 连接对象
        Connection connection = RabbitConnection.getConnection();
        // 连接通道
        Channel channel = connection.createChannel();

        /*
        主动声明一个非自动删除、非持久的交换，没有额外的参数
        (String exchange, BuiltinExchangeType type)
        参数：
            交易所——交易所的名称
            type – 交换类型
         */
         channel.exchangeDeclare("exchangeTopic",BuiltinExchangeType.TOPIC);
        /*
        声明队列 (String queue, boolean durable, boolean exclusive, boolean autoDelete,
                                        Map<String, Object> arguments)
        queue – 队列的名称
        durable - 是否是持久化队列，如果我们声明一个持久队列，则为真（该队列将在服务器重新启动后继续存在）--true
        exclusive - 是否是独占队列，如果我们声明一个独占队列，则为真（仅限于此连接）要消费当前队列的消息，必须使用创建这个的连接 --false
        autoDelete – 是否是自动删除队列，如果我们声明一个自动删除队列，则为 true（服务器将在不再使用时将其删除） --false
        arguments – 队列相关的其他属性（构造参数）
         */
        channel.queueDeclare("queueSmsTopic",true,false,false,null);
        /*
            (String queue, String exchange, String routingKey)
            将队列绑定到交换，没有额外的参数。
            参数：
                queue – 队列的名称
                交易所——交易所的名称
                routingKey – 用于绑定的路由键   routingKeySms
         */
        channel.queueBind("queueSmsTopic","exchangeTopic","#.sms.#");
        /*
        监听消息
            (String queue, boolean autoAck, Consumer callback)
            String queue – 队列的名称
            boolean autoAck – 如果服务器应考虑消息在传递后确认，则为 true；  自动确认
                          如果服务器应该期待明确的确认，则为 false 手动确认:实际项目使用手动确认
            Consumer callback - 回调  消费者对象的接口
         */
        channel.basicConsume("queueSmsTopic",true,new DefaultConsumer(channel){
            /**
             * 处理消息的业务代码
             * @param consumerTag 消息标记，系统会自动分配
             * @param envelope  信封，封装和当前消息相关的消息，后面的手动确认要是用
             * @param properties    发送消息时指定的附加属性
             * @param body          消息体
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("处理短信服务:"+new String(body));
            }
        });
    }
}
